#pragma once

#include "log_line.hpp"


inline void clear_serial_rx(HardwareSerial &s) {
    // 清空串口接收缓冲区
    while (s.available()) {
        s.read();
    }
}


inline int ascii_to_upper_case(int c) {
    if (c >= 'a' && c <= 'z') {
        return c - 'a' + 'A';
    }

    return c;
}


/**
 * @brief 从串口连续读取指定长度的字符，并转换成无符号整数。
 *
 * 只接受0-9 ASCII 字符，出现其他任何字符都返回错误。错误用UINT32_MAX 表示。
 *
 * 函数假设可以无阻塞的从串口读取len 个字符，否则会阻塞等待，如果读取超时，返回错误。
 *
 * @param s
 * @param len
 * @return uint32_t
 */
uint32_t parse_uint_from_serial(HardwareSerial &s, uint8_t len);


inline uint32_t parse_uint_from_serial(uint8_t len) {
    return parse_uint_from_serial(SerialLog, len);
}


/**
 * @brief 从串口输出固定长度的无符号整数。
 *
 * 数字右对齐，左侧填充placeholder 指定的字符，默认为空格。
 * 将数字按十进制分解后，默认转换为ASCII 字符，
 * 若hex = true，则不转换，直接输出。
 *
 * @param s
 * @param len
 * @param d
 * @param placeholder
 * @param hex
 */
void print_uint_to_serial(HardwareSerial &s,
                          uint8_t len,
                          uint32_t d,
                          uint8_t placeholder = ' ',
                          bool hex = false);


inline void print_uint_to_serial(uint8_t len,
                                 uint32_t d,
                                 uint8_t placeholder = ' ',
                                 bool hex = false) {
    print_uint_to_serial(SerialLog, len, d, placeholder, hex);
}


void print_hex_table_to_serial(HardwareSerial &s,
                               const uint8_t *arr,
                               size_t table_len,
                               size_t column_count);


inline void print_hex_table_to_serial(
    const uint8_t *arr,
    size_t table_len,
    size_t column_count) {
    print_hex_table_to_serial(SerialLog, arr, table_len, column_count);
}
